package cn.stylefeng.guns.modular.actualLoadInformation.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.guns.modular.actualLoadInformation.entity.QyuanPowerSdGridActual;
import cn.stylefeng.guns.modular.actualLoadInformation.enums.QyuanPowerSdGridActualExceptionEnum;
import cn.stylefeng.guns.modular.actualLoadInformation.mapper.QyuanPowerSdGridActualMapper;
import cn.stylefeng.guns.modular.actualLoadInformation.pojo.request.QyuanPowerSdGridActualRequest;
import cn.stylefeng.guns.modular.actualLoadInformation.service.QyuanPowerSdGridActualService;
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Date;
import java.math.BigDecimal;

/**
 * 负荷信息实际信息表，记录每天96个时间点的电网运行实际数据业务实现层
 *
 * @author 我是谭先生🐻
 * @date 2025/03/14 09:09
 */
@Service
public class QyuanPowerSdGridActualServiceImpl extends ServiceImpl<QyuanPowerSdGridActualMapper, QyuanPowerSdGridActual> implements QyuanPowerSdGridActualService {

	@Override
    public void add(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        QyuanPowerSdGridActual qyuanPowerSdGridActual = new QyuanPowerSdGridActual();
        BeanUtil.copyProperties(qyuanPowerSdGridActualRequest, qyuanPowerSdGridActual);
        this.save(qyuanPowerSdGridActual);
    }

    @Override
    public void del(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        QyuanPowerSdGridActual qyuanPowerSdGridActual = this.queryQyuanPowerSdGridActual(qyuanPowerSdGridActualRequest);
        this.removeById(qyuanPowerSdGridActual.getId());
    }

    @Override
    public void edit(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        QyuanPowerSdGridActual qyuanPowerSdGridActual = this.queryQyuanPowerSdGridActual(qyuanPowerSdGridActualRequest);
        BeanUtil.copyProperties(qyuanPowerSdGridActualRequest, qyuanPowerSdGridActual);
        this.updateById(qyuanPowerSdGridActual);
    }

    @Override
    public QyuanPowerSdGridActual detail(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        return this.queryQyuanPowerSdGridActual(qyuanPowerSdGridActualRequest);
    }

    @Override
    public PageResult<QyuanPowerSdGridActual> findPage(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        LambdaQueryWrapper<QyuanPowerSdGridActual> wrapper = createWrapper(qyuanPowerSdGridActualRequest);
        Page<QyuanPowerSdGridActual> sysRolePage = this.page(PageFactory.defaultPage(), wrapper);
        return PageResultFactory.createPageResult(sysRolePage);
    }

    @Override
    public List<QyuanPowerSdGridActual> findList(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        LambdaQueryWrapper<QyuanPowerSdGridActual> wrapper = this.createWrapper(qyuanPowerSdGridActualRequest);
        return this.list(wrapper);
    }

    /**
     * 获取信息
     *
     * @author 我是谭先生🐻
     * @date 2025/03/14 09:09
     */
    private QyuanPowerSdGridActual queryQyuanPowerSdGridActual(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        QyuanPowerSdGridActual qyuanPowerSdGridActual = this.getById(qyuanPowerSdGridActualRequest.getId());
        if (ObjectUtil.isEmpty(qyuanPowerSdGridActual)) {
            throw new ServiceException(QyuanPowerSdGridActualExceptionEnum.QYUAN_POWER_SD_GRID_ACTUAL_NOT_EXISTED);
        }
        return qyuanPowerSdGridActual;
    }

    /**
     * 创建查询wrapper
     *
     * @author 我是谭先生🐻
     * @date 2025/03/14 09:09
     */
    private LambdaQueryWrapper<QyuanPowerSdGridActual> createWrapper(QyuanPowerSdGridActualRequest qyuanPowerSdGridActualRequest) {
        LambdaQueryWrapper<QyuanPowerSdGridActual> queryWrapper = new LambdaQueryWrapper<>();

        Integer id = qyuanPowerSdGridActualRequest.getId();
        String usageDate = qyuanPowerSdGridActualRequest.getUsageDate();
        Integer timePoint = qyuanPowerSdGridActualRequest.getTimePoint();
        String timeSlot = qyuanPowerSdGridActualRequest.getTimeSlot();
        BigDecimal powerDirectLoad = qyuanPowerSdGridActualRequest.getPowerDirectLoad();
        BigDecimal powerLocalGeneration = qyuanPowerSdGridActualRequest.getPowerLocalGeneration();
        BigDecimal powerInterconnectionLoad = qyuanPowerSdGridActualRequest.getPowerInterconnectionLoad();
        BigDecimal powerWindGeneration = qyuanPowerSdGridActualRequest.getPowerWindGeneration();
        BigDecimal powerSolarGeneration = qyuanPowerSdGridActualRequest.getPowerSolarGeneration();
        BigDecimal powerPumpedStorage = qyuanPowerSdGridActualRequest.getPowerPumpedStorage();
        BigDecimal powerNuclearGeneration = qyuanPowerSdGridActualRequest.getPowerNuclearGeneration();
        BigDecimal powerSelfGeneration = qyuanPowerSdGridActualRequest.getPowerSelfGeneration();
        BigDecimal powerExperimentalGeneration = qyuanPowerSdGridActualRequest.getPowerExperimentalGeneration();
        String createdAt = qyuanPowerSdGridActualRequest.getCreateTime();
        String updatedAt = qyuanPowerSdGridActualRequest.getUpdateTime();

        queryWrapper.eq(ObjectUtil.isNotNull(id), QyuanPowerSdGridActual::getId, id);
        queryWrapper.eq(ObjectUtil.isNotNull(usageDate), QyuanPowerSdGridActual::getUsageDate, usageDate);
        queryWrapper.eq(ObjectUtil.isNotNull(timePoint), QyuanPowerSdGridActual::getTimePoint, timePoint);
        queryWrapper.like(ObjectUtil.isNotEmpty(timeSlot), QyuanPowerSdGridActual::getTimeSlot, timeSlot);
        queryWrapper.eq(ObjectUtil.isNotNull(powerDirectLoad), QyuanPowerSdGridActual::getPowerDirectLoad, powerDirectLoad);
        queryWrapper.eq(ObjectUtil.isNotNull(powerLocalGeneration), QyuanPowerSdGridActual::getPowerLocalGeneration, powerLocalGeneration);
        queryWrapper.eq(ObjectUtil.isNotNull(powerInterconnectionLoad), QyuanPowerSdGridActual::getPowerInterconnectionLoad, powerInterconnectionLoad);
        queryWrapper.eq(ObjectUtil.isNotNull(powerWindGeneration), QyuanPowerSdGridActual::getPowerWindGeneration, powerWindGeneration);
        queryWrapper.eq(ObjectUtil.isNotNull(powerSolarGeneration), QyuanPowerSdGridActual::getPowerSolarGeneration, powerSolarGeneration);
        queryWrapper.eq(ObjectUtil.isNotNull(powerPumpedStorage), QyuanPowerSdGridActual::getPowerPumpedStorage, powerPumpedStorage);
        queryWrapper.eq(ObjectUtil.isNotNull(powerNuclearGeneration), QyuanPowerSdGridActual::getPowerNuclearGeneration, powerNuclearGeneration);
        queryWrapper.eq(ObjectUtil.isNotNull(powerSelfGeneration), QyuanPowerSdGridActual::getPowerSelfGeneration, powerSelfGeneration);
        queryWrapper.eq(ObjectUtil.isNotNull(powerExperimentalGeneration), QyuanPowerSdGridActual::getPowerExperimentalGeneration, powerExperimentalGeneration);
        queryWrapper.eq(ObjectUtil.isNotNull(createdAt), QyuanPowerSdGridActual::getCreateTime, createdAt);
        queryWrapper.eq(ObjectUtil.isNotNull(updatedAt), QyuanPowerSdGridActual::getUpdateTime, updatedAt);

        return queryWrapper;
    }

}